package com.bana.sys.service;

import com.bana.sys.dao.CodeDAO;
import com.bana.sys.model.Code;
import com.bana.sys.model.CodePageParameter;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class CodeService {

    @Resource
    private CodeDAO codeDAO;

    /**
     * 字典缓存
     */
    private static Map<String,Map<Integer,String>> CodeMap =new ConcurrentHashMap<>();


    /**
     * 添加字典，并刷新缓存
     * @param code 字典
     * @return 添加后的字典，包含dm
     */
    public void insertCode(Code code)
    {
        codeDAO.insertCode(code);
        refresh();
    }

    /**
     * 更新字典，并刷新缓存
     * @param code 字典
     */
    public void updateCode(Code code)
    {
        codeDAO.updateCode(code);
        refresh();
    }

    /**
     * 删除字典，并刷新缓存
     * @param code 字典
     */
    public void deleteCode(Code code)
    {
        codeDAO.deleteCode(code.getDmlb(),code.getDm());
        refresh();
    }
    public String getCodeValue(String dmlb,int dm)
    {
        return getCodeValue(dmlb,dm,"-");
    }
    /**
     * 获取字典值
     * @param dmlb 字典类型
     * @param dm 字典键
     * @return 字典值
     */
    public String getCodeValue(String dmlb,int dm,String defaultValue)
    {
        if(CodeMap.isEmpty())
        {
            refresh();
        }
        if(CodeMap.containsKey(dmlb)&&CodeMap.get(dmlb).containsKey(dm))
        {
            return CodeMap.get(dmlb).get(dm);
        }
        else
        {
            return defaultValue;
        }
    }

    public Map<Integer, String> getCodeValue(String dmlb)
    {
        if(CodeMap.isEmpty())
        {
            refresh();
        }
        if(CodeMap.containsKey(dmlb))
        {
            return CodeMap.get(dmlb);
        }
        else
        {
            return null;
        }
    }

    /**
     * 刷新字典缓存
     */
    private void refresh()
    {
        CodeMap.clear();
        List<Code> codes=codeDAO.getCodes(new CodePageParameter());
        for(Code code:codes)
        {
            if(!CodeMap.containsKey(code.getDmlb()))
            {
                CodeMap.put(code.getDmlb(),new ConcurrentHashMap<>());
            }
            CodeMap.get(code.getDmlb()).put(code.getDm(),code.getDmsm());
        }
    }

}
